home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / Misc / GMS / GMSDev / Source / Asm / Demos / Pobs.s < prev    next >
Encoding:
Text File  |  1997-12-16  |  10.0 KB  |  416 lines

  1. ;-------T-------T------------------------T----------------------------------;
  2. ;Name:      Pobs
  3. ;Author:    Paul Manias
  4. ;Copyright: DreamWorld Productions (c) 1996-1997.  Freely distributable.
  5. ;
  6. ;This demo originally came from the HowToCode series.
  7. ;
  8. ;This demo took just 15 minutes in being converted to a multi-tasking demo,
  9. ;with no speed loss in run-time.
  10.  
  11.     INCDIR    "GMSDev:Includes/"
  12.     INCLUDE    "dpkernel/dpkernel.i"
  13.  
  14. width    EQU    40
  15. height    EQU    256
  16.  
  17.     SECTION    "Pobs",CODE
  18.  
  19. ;==========================================================================;
  20. ;                             INITIALISE DEMO
  21. ;==========================================================================;
  22.  
  23.     STARTDPK
  24.  
  25. Start:    MOVEM.L    A0-A6/D1-D7,-(SP)
  26.     move.l    DPKBase(pc),a6
  27.     lea    ScreenTags(pc),a0
  28.     sub.l    a1,a1
  29.     CALL    Init
  30.     tst.l    d0
  31.     beq.s    .Exit
  32.  
  33.     move.l    Screen(pc),a0
  34.     CALL    Display
  35.  
  36.     moveq    #ID_JOYDATA,d0    ;Get joydata structure.
  37.     CALL    Get
  38.     move.l    d0,JoyData
  39.     beq.s    .Exit
  40.     move.l    d0,a0    ;Initialise the joydata structure.
  41.     sub.l    a1,a1
  42.     CALL    Init
  43.     tst.l    d0
  44.     beq.s    .Exit
  45.  
  46.     bsr.s    Main
  47.  
  48. .Exit    move.l    DPKBase(pc),a6
  49.     move.l    JoyData(pc),a0
  50.     CALL    Free
  51.     move.l    Screen(pc),a0
  52.     CALL    Free
  53.     MOVEM.L    (SP)+,A0-A6/D1-D7
  54.     moveq    #ERR_OK,d0
  55.     rts
  56.  
  57. ;==========================================================================;
  58. ;                                MAIN LOOP
  59. ;==========================================================================;
  60.  
  61. Main:    bsr.s    InPtabs
  62.     bsr.w    Rmasks
  63.  
  64. .loop    move.l    SCRBase(pc),a6
  65.     CALL    scrWaitAVBL
  66.  
  67.     move.l    Screen(pc),a0
  68.     CALL    scrSwapBuffers
  69.  
  70.     move.l    BLTBase(pc),a6
  71.     move.l    Screen(pc),a1    ;a1 = Screen
  72.     move.l    GS_Bitmap(a1),a0    ;a0 = Bitmap
  73.     move.l    GS_MemPtr3(a1),BMP_Data(a0)
  74.     CALL    bltClearBitmap
  75.  
  76.     bsr.w    Calc
  77.     bsr.w    Put
  78.  
  79.     cmp.w    #293-1,number
  80.     beq.b    .mouse
  81.     addq.w    #1,number
  82.  
  83. .mouse    move.l    DPKBase(pc),a6
  84.     move.l    JoyData(pc),a0
  85.     CALL    Query
  86.     move.l    JoyData(pc),a0
  87.     move.l    JD_Buttons(a0),d0
  88.     btst    #JB_LMB,d0
  89.     beq.s    .loop
  90.     rts
  91.  
  92. ;===========================================================================;
  93. ;                            SET UP POB TABLES
  94. ;===========================================================================;
  95.  
  96. InPtabs    lea    pob_xbuffer,a0    ;a0 = Ptr to XBuffer.
  97.     moveq    #$00,d0    ;d0 = 00.
  98. .xloop    move.w    d0,d1
  99.     and.w    #$000f,d1    ;d1 = $000x
  100.     lsl.w    #6,d1    ;d1 = <<6
  101.     move.w    d1,(a0)+    ;a0 = +d1
  102.     move.w    d0,d1
  103.     and.w    #$fff0,d1    ;d2 = $xxx0
  104.     ror.w    #3,d1    ;d2 = $?xxx
  105.     move.w    d1,(a0)+    ;a0 = +d2
  106.     addq.w    #1,d0    ;d0 = ++1
  107.     cmp.w    #width*8,d0    ;d0 > Is d0 == ScreenWidth?
  108.     bne.b    .xloop
  109.  
  110.     lea    pob_ybuffer,a0
  111.     moveq    #$00,d0
  112. .yloop    move.w    d0,d1
  113.     mulu    #width,d1
  114.     move.l    d1,(a0)+
  115.     addq.w    #1,d0
  116.     cmp.w    #height,d0
  117.     bne.b    .yloop
  118.     rts
  119.  
  120. ;===========================================================================;
  121. ;
  122. ;===========================================================================;
  123.  
  124. Rmasks:    moveq    #0,d7
  125.     lea    shape_buffer,a1
  126. .loop1    lea    pob_shape(pc),a0
  127.     move.w    #16,d6
  128. .loop2    move.l    (a0)+,d0
  129.     ror.l    d7,d0
  130.     move.l    d0,(a1)+
  131.     subq.w    #1,d6
  132.     bne.b    .loop2
  133.     addq.w    #1,d7
  134.     cmpi.w    #16,d7
  135.     bne.b    .loop1
  136.     rts
  137.  
  138. ;===========================================================================;
  139. ;                       ADJUST POB SCREEN POSITIONS
  140. ;===========================================================================;
  141.  
  142. Calc:    move.w    #$eeee,d0
  143.     move.w    #720,d6
  144.     lea    sinx_pointer1(pc),a0
  145.  
  146.     movem.l    (a0),a2/a3/a4/a5
  147.     movem.w    sinx_add1(pc),d2/d3/d4/d5
  148.  
  149.     add.w    d2,a2
  150.     cmp.w    (a2),d0
  151.     bne.s    .bkip1
  152.     sub.w    d6,a2
  153.  
  154. .bkip1    add.w    d3,a3
  155.     cmp.w    (a3),d0
  156.     bne.s    .bkip2
  157.     sub.w    d6,a3
  158.  
  159. .bkip2    add.w    d4,a4
  160.     cmp.w    (a4),d0
  161.     bne.s    .bkip3
  162.     sub.w    d6,a4
  163.  
  164. .bkip3    add.w    d5,a5
  165.     cmp.w    (a5),d0
  166.     bne.s    .bkip4
  167.     sub.w    d6,a5
  168.  
  169. .bkip4    movem.l    a2/a3/a4/a5,(a0)
  170.     lea    coord_stack,a0
  171.     movem.w    sinx_dist1(pc),d3-d4/a1/a6
  172.     move.w    d0,d5
  173.     move.w    number(pc),d7    ;d7 = Number of Pobs.
  174. .loop    add.w    d3,a2
  175.     add.w    d4,a3
  176.     cmp.w    (a2),d5
  177.     bne.s    .not_x1
  178.     sub.w    d6,a2
  179. .not_x1    cmp.w    (a3),d5
  180.     bne.s    .not_x2
  181.     suba.w    d6,a3
  182. .not_x2    move.w    (a2),d0
  183.     add.w    (a3),d0
  184.     add.w    a1,a4
  185.     add.w    a6,a5
  186.     cmp.w    (a4),d5
  187.     bne.b    .not_y1
  188.     sub.w    d6,a4
  189. .not_y1    cmp.w    (a5),d5
  190.     bne.b    .not_y2
  191.     sub.w    d6,a5
  192. .not_y2    move.w    (a4),d1
  193.     add.w    (a5),d1
  194.     move.w    d0,(a0)+
  195.     move.w    d1,(a0)+
  196.     dbf    d7,.loop
  197.     rts
  198.  
  199. ;===========================================================================;
  200. ;                          PLACE POBS ON SCREEN
  201. ;===========================================================================;
  202.  
  203. Put:    lea    pob_xbuffer,a0
  204.     lea    pob_ybuffer,a1
  205.     lea    shape_buffer,a4
  206.     move.l    Screen(pc),a6
  207.     move.l    GS_MemPtr2(a6),a6
  208.     lea    coord_stack,a5
  209.  
  210.     move.w    number(pc),d7
  211. .loop    movem.w    (a5)+,d0/d1    ;d0 = X, d1 = Y
  212.     add.w    d0,d0
  213.     add.w    d0,d0    ;d0 = (XCoord)*4
  214.     add.w    d1,d1
  215.     add.w    d1,d1    ;d1 = (YCoord)*4
  216.     move.l    (a0,d0.w),d0
  217.     lea    width(a6,d0.w),a3
  218.     add.l    (a1,d1.w),a3
  219.     swap    d0
  220.     lea    (a4,d0.w),a2
  221.     movem.l    (a2),d0-d5    ;d0..d5 = POB Gfx Data. 
  222.     or.l    d0,(a3)
  223.     or.l    d1,width(a3)
  224.     or.l    d2,width*2(a3)
  225.     or.l    d3,width*3(a3)
  226.     or.l    d4,width*4(a3)
  227.     or.l    d5,width*5(a3)
  228.     dbf    d7,.loop
  229.     rts
  230.  
  231. ;===========================================================================;
  232. ;
  233. ;===========================================================================;
  234.  
  235. JoyData:    dc.l  0
  236.  
  237. sinx_pointer1:    dc.l  sin_xtab
  238. sinx_pointer2:    dc.l  sin_xtab
  239. siny_pointer1:    dc.l  sin_ytab
  240. siny_pointer2:    dc.l  sin_ytab
  241. sinx_add1:    dc.w  1*2    ;change values here to obtain
  242. sinx_add2:    dc.w  5*2    ;new patterns
  243. siny_add1:    dc.w  3*2
  244. siny_add2:    dc.w  2*2
  245. sinx_dist1:    dc.w  4*2
  246. sinx_dist2:    dc.w  3*2
  247. siny_dist1:    dc.w  1*2
  248. siny_dist2:    dc.w  2*2
  249. number:        dc.w  0            ;number of 'pobs'
  250.  
  251. sin_xtab:
  252.     dc.w    75,76,78,79,80,82,83,84
  253.     dc.w    85,87,88,89,91,92,93,94
  254.     dc.w    96,97,98,99,101,102,103,104
  255.     dc.w    106,107,108,109,110,111,112,114
  256.     dc.w    115,116,117,118,119,120,121,122
  257.     dc.w    123,124,125,126,127,128,129,130
  258.     dc.w    131,132,132,133,134,135,136,136
  259.     dc.w    137,138,139,139,140,141,141,142
  260.     dc.w    142,143,144,144,145,145,145,146
  261.     dc.w    146,147,147,147,148,148,148,149
  262.     dc.w    149,149,149,149,150,150,150,150
  263.     dc.w    150,150,150,150,150,150,150,150
  264.     dc.w    150,149,149,149,149,149,148,148
  265.     dc.w    148,147,147,147,146,146,145,145
  266.     dc.w    145,144,144,143,142,142,141,141
  267.     dc.w    140,139,139,138,137,136,136,135
  268.     dc.w    134,133,132,132,131,130,129,128
  269.     dc.w    127,126,125,124,123,122,121,120
  270.     dc.w    119,118,117,116,115,114,113,111
  271.     dc.w    110,109,108,107,106,104,103,102
  272.     dc.w    101,99,98,97,96,94,93,92
  273.     dc.w    91,89,88,87,85,84,83,82
  274.     dc.w    80,79,78,76,75,74,72,71
  275.     dc.w    70,68,67,66,65,63,62,61
  276.     dc.w    59,58,57,56,54,53,52,51
  277.     dc.w    49,48,47,46,44,43,42,41
  278.     dc.w    40,39,38,36,35,34,33,32
  279.     dc.w    31,30,29,28,27,26,25,24
  280.     dc.w    23,22,21,20,19,18,18,17
  281.     dc.w    16,15,14,14,13,12,11,11
  282.     dc.w    10,9,9,8,8,7,6,6
  283.     dc.w    5,5,5,4,4,3,3,3
  284.     dc.w    2,2,2,1,1,1,1,1
  285.     dc.w    0,0,0,0,0,0,0,0
  286.     dc.w    0,0,0,0,0,1,1,1
  287.     dc.w    1,1,2,2,2,3,3,3
  288.     dc.w    4,4,5,5,5,6,6,7
  289.     dc.w    8,8,9,9,10,11,11,12
  290.     dc.w    13,14,14,15,16,17,18,18
  291.     dc.w    19,20,21,22,23,24,25,26
  292.     dc.w    27,28,29,30,31,32,33,34
  293.     dc.w    35,36,37,39,40,41,42,43
  294.     dc.w    44,46,47,48,49,51,52,53
  295.     dc.w    54,56,57,58,59,61,62,63
  296.     dc.w    65,66,67,68,70,71,72,74
  297.     dc.w    75
  298.     dc.w    $eeee,$eeee,$eeee,$eeee
  299.     dc.w    $eeee,$eeee,$eeee,$eeee
  300.     dc.w    $eeee,$eeee,$eeee,$eeee
  301.     dc.w    $eeee,$eeee,$eeee,$eeee
  302.     dc.w    $eeee,$eeee,$eeee,$eeee
  303.     dc.w    $eeee,$eeee,$eeee,$eeee
  304.     dc.w    $eeee,$eeee,$eeee,$eeee
  305.     dc.w    $eeee,$eeee,$eeee,$eeee
  306.     dc.w    $eeee,$eeee,$eeee,$eeee
  307.     dc.w    $eeee,$eeee,$eeee,$eeee
  308.  
  309. sin_ytab:
  310.     dc.w    57,59,60,61,62,63,64,65
  311.     dc.w    66,66,67,68,69,70,71,72
  312.     dc.w    73,74,75,76,77,78,79,80
  313.     dc.w    81,82,83,84,84,85,86,87
  314.     dc.w    88,89,90,90,91,92,93,94
  315.     dc.w    94,95,96,97,97,98,99,100
  316.     dc.w    100,101,102,102,103,103,104,105
  317.     dc.w    105,106,106,107,107,108,108,109
  318.     dc.w    109,110,110,110,111,111,112,112
  319.     dc.w    112,112,113,113,113,114,114,114
  320.     dc.w    114,114,114,115,115,115,115,115
  321.     dc.w    115,115,115,115,115,115,115,115
  322.     dc.w    115,115,114,114,114,114,114,114
  323.     dc.w    113,113,113,112,112,112,112,111
  324.     dc.w    111,110,110,110,109,109,108,108
  325.     dc.w    107,107,106,106,105,105,104,103
  326.     dc.w    103,102,102,101,100,100,99,98
  327.     dc.w    97,97,96,95,94,94,93,92
  328.     dc.w    91,90,90,89,88,87,86,85
  329.     dc.w    84,84,83,82,81,80,79,78
  330.     dc.w    77,76,75,74,73,72,71,70
  331.     dc.w    69,68,67,66,66,65,64,63
  332.     dc.w    62,61,60,59,58,56,55,54
  333.     dc.w    53,52,51,50,49,49,48,47
  334.     dc.w    46,45,44,43,42,41,40,39
  335.     dc.w    38,37,36,35,34,33,32,31
  336.     dc.w    31,30,29,28,27,26,25,25
  337.     dc.w    24,23,22,21,21,20,19,18
  338.     dc.w    18,17,16,15,15,14,13,13
  339.     dc.w    12,12,11,10,10,9,9,8
  340.     dc.w    8,7,7,6,6,5,5,5
  341.     dc.w    4,4,3,3,3,3,2,2
  342.     dc.w    2,1,1,1,1,1,1,0
  343.     dc.w    0,0,0,0,0,0,0,0
  344.     dc.w    0,0,0,0,0,0,1,1
  345.     dc.w    1,1,1,1,2,2,2,3
  346.     dc.w    3,3,3,4,4,5,5,5
  347.     dc.w    6,6,7,7,8,8,9,9
  348.     dc.w    10,10,11,12,12,13,13,14
  349.     dc.w    15,15,16,17,18,18,19,20
  350.     dc.w    21,21,22,23,24,25,25,26
  351.     dc.w    27,28,29,30,31,31,32,33
  352.     dc.w    34,35,36,37,38,39,40,41
  353.     dc.w    42,43,44,45,46,47,48,49
  354.     dc.w    49,50,51,52,53,54,55,56
  355.     dc.w    57
  356.     dc.w    $eeee,$eeee,$eeee,$eeee
  357.     dc.w    $eeee,$eeee,$eeee,$eeee
  358.     dc.w    $eeee,$eeee,$eeee,$eeee
  359.     dc.w    $eeee,$eeee,$eeee,$eeee
  360.     dc.w    $eeee,$eeee,$eeee,$eeee
  361.     dc.w    $eeee,$eeee,$eeee,$eeee
  362.     dc.w    $eeee,$eeee,$eeee,$eeee
  363.     dc.w    $eeee,$eeee,$eeee,$eeee
  364.     dc.w    $eeee,$eeee,$eeee,$eeee
  365.     dc.w    $eeee,$eeee,$eeee,$eeee
  366.  
  367. pob_shape:
  368.     dc.w    %0000000110000000,0
  369.     dc.w    %0000000110000000,0
  370.     dc.w    %0000011111100000,0
  371.     dc.w    %0000011111100000,0
  372.     dc.w    %0000000110000000,0
  373.     dc.w    %0000000110000000,0
  374.  
  375. ;===========================================================================;
  376. ;                                  DATA
  377. ;===========================================================================;
  378.  
  379. ScreenTags:    dc.l  TAGS_SCREEN
  380. Screen:        dc.l  0
  381.         dc.l  GSA_MemPtr1,ScreenMem
  382.         dc.l  GSA_MemPtr2,ScreenMem+height*width
  383.         dc.l  GSA_MemPtr3,ScreenMem+height*width*2
  384.         dc.l  GSA_Palette,.palette
  385.         dc.l  GSA_Width,320
  386.         dc.l  GSA_Height,256
  387.         dc.l  GSA_Attrib,TPLBUFFER
  388.         dc.l    GSA_BitmapTags,0
  389.         dc.l    BMA_Type,PLANAR
  390.         dc.l    BMA_AmtColours,2
  391.         dc.l    TAGEND,0
  392.         dc.l  TAGEND
  393.  
  394. .palette    dc.l  PALETTE,2
  395.         dc.l  $00000000,$00f0f000
  396.  
  397. ;===========================================================================;
  398.  
  399.     SECTION    Screens,BSS_C
  400.  
  401. ScreenMem:    ds.b  (height*width*3)+(width*50)
  402. shape_buffer:    ds.l  256
  403. pob_xbuffer:    ds.l  (width*8)
  404. pob_ybuffer:    ds.l  height
  405. coord_stack:    ds.l  1500
  406.  
  407. ;===========================================================================;
  408.  
  409. ProgName:    dc.b  "Pobs",0
  410. ProgAuthor:    dc.b  "Paul Manias",0
  411. ProgDate:    dc.b  "16 December 1997",0
  412. ProgCopyright:    dc.b  "DreamWorld Productions (c) 1996-1997.  Freely distributable.",0
  413. ProgShort:    dc.b  "Triple buffered bob demonstration.",0
  414.         even
  415.  
  416.